﻿using Libs;
using System;
using System.Threading;
using System.Windows.Forms;
using WriteForFighting.Game;

namespace WriteForFighting
{
    static class Start
    {
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();

            try
            {
                Mutex mutex = new Mutex(false, GD.APP_SYSTEM_NAME);
                if (mutex.WaitOne(0, false) == false)
                {
                    MessageBox.Show("エラー：既に起動しています。\n" +
                        "多重起動はできません。",
                            GD.APP_NAME + ": error!!",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Warning);

                    return;
                }

                PreInit();
            }
            catch (Exception e)
            {
                using (FormErrorInfo f = new FormErrorInfo(e, GD.APP_NAME + "の初期化前処理中に問題が発生しました。"))
                {
                    f.ShowDialog();
                }

                return;
            }

            if (DX.DxLib_Init() == -1)
            {
                MessageBox.Show("エラー：DXライブラリの初期化に失敗しました。\n",
                    GD.APP_NAME + ": error!!",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return;
            }

            try
            {
                GameMain.Init();
            }
            catch (Exception e)
            {
                using (FormErrorInfo f = new FormErrorInfo(e, GD.APP_NAME + "の初期化処理中に問題が発生しました。"))
                {
                    f.ShowDialog();
                }

                return;
            }

            try
            {
                GameMain gameMain = new GameMain();

                DX.SetWindowVisibleFlag(DX.TRUE);
                gameMain.Start();
            }
            catch (Exception e)
            {
                using (FormErrorInfo f = new FormErrorInfo(e, "問題が発生したため、" + GD.APP_NAME + "を終了します。"))
                {
                    f.ShowDialog();
                }
            }
            finally
            {
                DX.DxLib_End();
            }
        }

        static void PreInit()
        {
            DX.SetWindowVisibleFlag(DX.FALSE);
            DX.SetWindowSize(GD.SCREEN_WIDTH, GD.SCREEN_HEIGHT);
            DX.SetGraphMode(GD.SCREEN_WIDTH, GD.SCREEN_HEIGHT, 32);
            DX.SetDXArchiveExtension(GD.ARCHIVE_EXTENSION);
            DX.SetWindowText(GD.APP_NAME + " : " + GD.VERSION);
            DX.SetBackgroundColor(0, 0, 0);
            DX.ChangeWindowMode(DX.TRUE);
            DX.SetAlwaysRunFlag(DX.FALSE);
            DX.SetBackgroundColor(255, 255, 255);
            DX.SetAlwaysRunFlag(DX.FALSE);
#if !DEBUG
            DX.SetOutApplicationLogValidFlag(DX.FALSE);
#endif
        }
    }
}
